热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

`db.serialize`如何在`node-sqlite3`中工作

如何解决《`db.serialize`如何在`node-sqlite3`中工作》经验,为你挑选了1个好方法。

最近我学习使用node和node-sqlite3来操作sqlite3,这里有一个示例.

var sqlite3 = require('sqlite3');
var db = new sqlite3.Database(':memory:');
db.serialize(function() {
    db.run("CREATE TABLE test(info TEXT)");
    db.run("INSERT INTO test (info) VALUES ('info1')");
})
db.close();

文档说db.serialized用来确保SQL行按顺序执行,但我很困惑,为什么不按顺序执行它们db.serialize,毕竟它们会从事件队列中拉出并按顺序执行?它在这里如何运作?

如果只有一个sql要执行,运行它是否安全,db.serialize如下所示?

var sqlite3 = require('sqlite3');
var db = new sqlite3.Database(':memory:');
db.run("CREATE TABLE test(info TEXT)");
db.close();

Malvineous.. 26

serialize()函数内的每个命令都保证在下一个命令启动之前完成执行.

在您的示例中,CREATE TABLE将在INSERT运行之前完成.如果你没有使用serialize()那么CREATE TABLEINSERT语句将并行运行.它们会一个接一个地快速启动,INSERT实际上可能在创建表之前完成,从而在尝试将数据插入到不存在的表中时出错.

这被称为竞争条件,因为每次运行程序时,您都可能获得不同的胜利者.如果CREATE TABLE赢得比赛,那么该计划将正常运作.但如果INSERT赢得比赛,该计划将打破错误.既然你无法控制谁赢得比赛,那么即使从开始到结束serialize()也会停止,确保你每次都获得相同的结果.INSERTCREATE TABLE

在第二个只有一个语句的例子中,serialize()仍然需要.这是因为run()启动SQL查询但立即返回,使查询在后台运行.由于您的下一个命令是close()数据库的一个命令,因此您将在查询仍在运行时将其截断.

由于serialize()直到最后一个内部查询完成才返回,因此使用它将close()一直保持到查询完成为止.

如果您使用的是不同类型的查询(例如,响应用户单击网页上的按钮,数据库在调用之间保持打开状态),那么您可能不需要serialize().它取决于每个查询后面的代码是否要求在它完成之前的查询.

在决定是否使用时serialize(),将任何非序列化查询视为已注释掉,然后查看代码是否仍然有效可能会有所帮助.在上面的第一个例子中,删除CREATE TABLE命令会破坏以下INSERT语句(因为那时没有要插入的表),因此需要序列化这些语句.但是,如果您有两个CREATE TABLE命令,那么删除一个命令不会影响另一个命令,因此这两个命令不必序列化.

(这个提示不适用于close()- 经验法则只有close()在一切都运行完毕后才会调用.)



1> Malvineous..:

serialize()函数内的每个命令都保证在下一个命令启动之前完成执行.

在您的示例中,CREATE TABLE将在INSERT运行之前完成.如果你没有使用serialize()那么CREATE TABLEINSERT语句将并行运行.它们会一个接一个地快速启动,INSERT实际上可能在创建表之前完成,从而在尝试将数据插入到不存在的表中时出错.

这被称为竞争条件,因为每次运行程序时,您都可能获得不同的胜利者.如果CREATE TABLE赢得比赛,那么该计划将正常运作.但如果INSERT赢得比赛,该计划将打破错误.既然你无法控制谁赢得比赛,那么即使从开始到结束serialize()也会停止,确保你每次都获得相同的结果.INSERTCREATE TABLE

在第二个只有一个语句的例子中,serialize()仍然需要.这是因为run()启动SQL查询但立即返回,使查询在后台运行.由于您的下一个命令是close()数据库的一个命令,因此您将在查询仍在运行时将其截断.

由于serialize()直到最后一个内部查询完成才返回,因此使用它将close()一直保持到查询完成为止.

如果您使用的是不同类型的查询(例如,响应用户单击网页上的按钮,数据库在调用之间保持打开状态),那么您可能不需要serialize().它取决于每个查询后面的代码是否要求在它完成之前的查询.

在决定是否使用时serialize(),将任何非序列化查询视为已注释掉,然后查看代码是否仍然有效可能会有所帮助.在上面的第一个例子中,删除CREATE TABLE命令会破坏以下INSERT语句(因为那时没有要插入的表),因此需要序列化这些语句.但是,如果您有两个CREATE TABLE命令,那么删除一个命令不会影响另一个命令,因此这两个命令不必序列化.

(这个提示不适用于close()- 经验法则只有close()在一切都运行完毕后才会调用.)


推荐阅读
  • 使用Node.js进行数据库操作和身份认证的方法:Session和JWT
    文章目录数据库和身份认证Node操作mysql配置mysql模块操作mysql数据库Web开发模式服务端渲染前后端分离如何选择身份认证Session认证机制Session工作原理E ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 我正在一个涉及SQLite的项目中,我只有一个数据库文件,现在我正在测试我的应 ... [详细]
  • 在Android Studio中查看SQLite数据库
    原来查看数据库内容,我们一般都是将数据库文件从手机导出,再用专门的软件打开查看,比较繁琐。最近发现了一个比较方便的方法:使用工具stetho。使用方式在gradle中配置depen ... [详细]
  • SQLite–CONSTRAINTS(约束)约束是数据列在表上执行的规则。这些是用来限制的数据类型可以进入一个表。这样可以确保数据的准确性和可靠性在数据库中。    级或表级约束可 ... [详细]
  • 有没有人用过sqlite?关于tablehasnocolumnnamedcolumn插入数据的时候报上边的错。问题是我明明有这一列。直接在sqlitedevoloper里执 ... [详细]
  • Python使用SQLite1.sqlite3的安装python2.5.x以上版本默认自带sqlite3模块。2.链接sqlite3数据库```#导入sqlite3模块import ... [详细]
  • 背景使用sqlite3的命令实现数据去重,与无效数据删除等操作。所有操作均封装在shellscript中。创建数据库邮件数据库:UserEmail.dbEmail表:TABLE_EM ... [详细]
  • Django 入门学习(3)
    在例4的基础上,我希望直接保存数据到数据库中。Django自带了一个sqlite的数据库,已经配置好了可以直接使用。使用方式和sqlalchemy类似,相当于一 ... [详细]
  • 对于很多想做通讯录,或者很多想对系统通讯录操作的童鞋们肯定都会遇到个问题,系统通讯录操作很麻烦,我能不能直接看看底层联系人表结构呢?如果可以看到的话,那一定能提高相关操作的准确性和效率吧。  不多说, ... [详细]
author-avatar
yf_992258
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有